package com.artisan;

import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;

import java.util.Map;

/**
 * 重新阅读顾问类
 * 
 * 该顾问用于在用户提问前添加指令，让模型重新阅读问题，以提高回答准确性
 */
public class ReReadingAdvisor implements BaseAdvisor {
    
    private static final String DEFAULT_USER_TEXT_ADVISE = """
      {re2_input_query}
      Read the question again: {re2_input_query}
      """;
    
    /**
     * 在请求发送前修改提示词内容
     * 
     * @param chatClientRequest 聊天客户端请求对象，包含原始提示词信息
     * @param advisorChain 顾问链对象
     * @return 修改后的聊天客户端请求对象
     */
    @Override
    public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
        // 获取用户原始提示词内容
        String contents = chatClientRequest.prompt().getContents();

        // 使用模板渲染新的提示词，要求模型重新阅读问题
        String re2InputQuery = PromptTemplate.builder().template(DEFAULT_USER_TEXT_ADVISE).build()
                .render(Map.of("re2_input_query", contents));

        // 构建并返回修改后的请求对象
        ChatClientRequest clientRequest = chatClientRequest.mutate()
                .prompt(Prompt.builder().content(re2InputQuery).build())
                .build();
        return clientRequest;
    }

    /**
     * 在响应返回后进行处理
     * 
     * @param chatClientResponse 聊天客户端响应对象
     * @param advisorChain 顾问链对象
     * @return 聊天客户端响应对象
     */
    @Override
    public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
        return chatClientResponse;
    }

    /**
     * 获取顾问执行顺序
     * 
     * @return 顾问执行顺序，数值越小优先级越高
     */
    @Override
    public int getOrder() {
        return 0;
    }
}